
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
/**
 * @author 贾志宇
 * @create 2022-07-08-15:29
 */
public class Tutorial {

    public static void main(String[] args) {
        System.out.println("我的第一个 Apache Shiro 应用程序");

        //1. 这里的SecurityManager是org.apache.shiro.mgt.SecurityManager，而不是java.lang.SecurityManager
        // 加载配置文件----------------------干啥发生飞洒发生
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

        //2.解析配置文件，并且返回一些SecurityManger实例
        SecurityManager securityManager = factory.getInstance();

        //3.设置SecurityManager到静态内存区，单例模式
        SecurityUtils.setSecurityManager(securityManager);


        // 安全操作
        Subject currentUser = SecurityUtils.getSubject();

        // 在应用的当前会话中设置属性
        Session session =  currentUser.getSession();
        session.setAttribute("key","value");

        //当前我们的用户是匿名的用户，会对用户进行认证
        if (!currentUser.isAuthenticated()){
            UsernamePasswordToken token = new UsernamePasswordToken("user1", "user1");

            token.setRememberMe(true);

            //尝试进行登录用户，如果登录失败了，我们进行一些处理

            try{
                currentUser.login(token);

                //当我们获登录用户之后
                System.out.println("User [" + currentUser.getPrincipal() + "] 登陆成功");


                // 查看用户是否有指定的角色
                if ( currentUser.hasRole( "client" ) ) {
                    System.out.println("你拥有客户的角色" );
                }
                if(currentUser.hasRole( "admin")){
                    System.out.println("你拥有管理员的角色" );
                }

                if(currentUser.hasRole( "goodguy")){
                    System.out.println("你拥有好小伙的角色" );
                }
                else {
                    System.out.println( "你没有任何角色" );
                }

                // 查看用户是否有某个权限
                if ( currentUser.isPermitted( "看:desk" ) ) {
                    System.out.println("你可以看电视");
                } else {
                    System.out.println("对不起，你不能看。");
                }

                if ( currentUser.isPermitted( "winnebago:drive:falali" ) ) {
                    System.out.println("你可以开这辆法拉利，这钥匙，祝你玩得开心！");
                } else {
                    System.out.println("对不起，你不可以开这辆法拉利");
                }

                //登出

                currentUser.logout();

            }
            catch ( UnknownAccountException uae ) {
                //账户不存在的操作
                System.out.println("账户不存在");
            } catch ( IncorrectCredentialsException ice ) {
                //密码不正确
                System.out.println("密码不正确");
            } catch ( LockedAccountException lae ) {
                //用户被锁定了
                System.out.println("用户被锁定了");
            } catch ( AuthenticationException ae ) {
                //无法判断的情形
                System.out.println("自定义一些异常处理");
            }

        }


        System.exit(0);
    }
}
